<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // JS是单线程的  => 同一时间只能完成一件事  => JS如何实现异步操作?

    // 所有任务可以分成两种，一种是同步任务（synchronous），另一种是异步任务（asynchronous）。同步任务指的是，在主线程上排队执行的任务，只有前一个任务执行完毕，才能执行后一个任务；异步任务指的是，不进入主线程、而进入”任务队列”（task queue）的任务，只有”任务队列”通知主线程，某个异步任务可以执行了，该任务才会进入主线程执行;

    // （1）所有同步任务都在主线程(同步代码)上执行，形成一个执行栈（execution context stack）。
    // （2）主线程之外，还存在一个"任务队列"（task queue）。只要异步任务有了运行结果，就在"任务队列"之中放置一个事件。
    // （3）一旦"执行栈"中的所有同步任务执行完毕(主线程代码执行完毕)，系统就会读取"任务队列"，看看里面有哪些事件。那些对应的异步任务，于是结束等待状态，进入执行栈(主线程)，开始执行。
    // （4）主线程不断重复上面的第三步


    debugger;
    console.time("代码开始:");
    for (var i = 0; i < 4; i++) {
        setTimeout(function () {
            debugger;
            console.log(i);
        }, 1000);
    }
    console.log("循环结束:", i);


    // console.log(1)
    // setTimeout(function () {
    //     console.log(2);
    // }, 0);
    // console.log(3)





</script>

</html>